package ui.modelApplication;

import java.util.ArrayList;

import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.Observable;

import com.lanchita.excepciones.EstadoErroneoException;

import ui.View.BuscadorWindow;
import ui.View.ErrorWindow;
import ui.View.ExitoWindow;
import ui.View.SobrereservaWindow;

import dominio.*;

@Observable
public class ApplicationBuscador 
{
	private Buscador buscador;
	private BuscadorWindow ventana;
	private ModelUsuario usuario;
	private String origen;
	private String destino;
	private String fecha;
	private ModelAsiento seleccionado;
	
	public ApplicationBuscador(ModelUsuario usuario) {
		super();
		this.setUsuario(usuario);
		this.viajesEncontrados = new ArrayList<ModelAsiento>();
		this.setBuscador(new Buscador());
		this.getBuscador().agregarAerolinea(new GestionadorLanchita());
		//this.getBuscador().agregarAerolinea(GestionadorOceanic.getInstance());
	}
	
	public ModelAsiento getSeleccionado() {
		return seleccionado;
	}

	public void setSeleccionado(ModelAsiento seleccionado) {
		this.seleccionado = seleccionado;
	}

	private ArrayList<ModelAsiento> viajesEncontrados;
	
	
	
	public ModelUsuario getUsuario() {
		return usuario;
	}

	public void setUsuario(ModelUsuario usuario) {
		this.usuario = usuario;
	}
	
	public void setOrigen(String origen) {
		this.origen = origen;
	}
	
	public String getOrigen() {
		return origen;
	}
	
	public void setDestino(String destino) {
		this.destino = destino;
	}
	
	public String getDestino() {
		return destino;
	}
	
	public void setFecha(String fecha) {
		this.fecha = fecha;
	}
	
	public String getFecha() {
		return fecha;
	}
	
	public BuscadorWindow getVentana() {
		return ventana;
	}

	public void setVentana(BuscadorWindow ventana) {
		this.ventana = ventana;
	}
	
	public void setViajesEncontrados(ArrayList<Viaje> viajesEncontrados) 
	{
		ArrayList<ModelAsiento> asientosTransformados = new ArrayList<ModelAsiento>();
		for(Viaje viaje: viajesEncontrados)
			asientosTransformados.add(new ModelAsiento(viaje));
		this.viajesEncontrados = asientosTransformados;
	}

	public ArrayList<ModelAsiento> getViajesEncontrados() {
		return viajesEncontrados;
	}
	
	public void setBuscador(Buscador buscador) {
		this.buscador = buscador;
	}

	public Buscador getBuscador() {
		return buscador;
	}

	public void Buscar()
	{
		if (this.origen		== 	null)
			throw new UserException("El campo origen es obligatorio");
		if (this.destino 	== 	null)
			throw new UserException("El campo destino es obligatorio");
		if (this.fecha 		== 	null)
			throw new UserException("El campo fecha es obligatorio");
		
		Busqueda busqueda = new Busqueda();
		busqueda.setCiudadOrigen(this.getOrigen());
		busqueda.setCiudadDestino(this.getDestino());
		busqueda.setFecha(this.getFecha());
		busqueda.setConEscala(false);
		
		this.setViajesEncontrados(this.getBuscador().buscarAsientosQueSeAjustenA( busqueda, this.getUsuario().getUsuario() ) );
	} 
		
	public void Comprar()
	{
		try
		{
			this.getBuscador().comprarAsiento(this.getSeleccionado().getAsiento(), this.getUsuario().getUsuario());
			ExitoWindow exito = new ExitoWindow(this.getVentana(), this);
			exito.setTaskDescription("El asiento " + seleccionado.getCodigoDeVuelo() + "-" + seleccionado.getCodigoDeAsiento() + " ha sido comprado exitosamente");
			exito.open();
			this.getUsuario().getAsientosComprados().add(seleccionado);
		}
		catch (RuntimeException e)
		{
			ErrorWindow error = new ErrorWindow(this.getVentana(), this);
			error.setTaskDescription("Ha ocurrido un error en su compra : " + e.getMessage() );
			error.open();
		}
		
	}
	
	public void sobreReservar()
	{
		this.getBuscador().getAerolineas().get(0).sobreReservarAsiento(this.getUsuario().getUsuario().getDNI(),this.getSeleccionado().getAsiento());
	}
	
	public void Reservar()
	{
		try
		{
			this.getBuscador().getAerolineas().get(0).reservarAsiento(this.getUsuario().getUsuario().getDNI(), this.getSeleccionado().getAsiento());//Implementar bien 
			ExitoWindow exito = new ExitoWindow(this.getVentana(), this);
			exito.setTaskDescription("El asiento " + seleccionado.getCodigoDeVuelo() + "-" + seleccionado.getCodigoDeAsiento() + " ha sido reservado exitosamente");
			exito.open();
			this.getUsuario().getAsientosReservados().add(seleccionado);
		}
		catch (EstadoErroneoException e)
		{	
			SobrereservaWindow sobreReservar = new SobrereservaWindow(this.getVentana(), this);
			sobreReservar.setTaskDescription("El asiento " + this.getSeleccionado().getCodigoDeVuelo() + "-" + this.getSeleccionado().getCodigoDeAsiento() + "ya se encuentra reservado");
			sobreReservar.open();
		}
		catch (RuntimeException e)
		{
			ErrorWindow error = new ErrorWindow(this.getVentana(), this);
			error.setTaskDescription("Ha ocurrido un error en su reserva : " + e.getMessage() );
			error.open();
		}
		
	}
}